home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / Params / PADnoteParameters.C < prev    next >
C/C++ Source or Header  |  2005-03-14  |  22KB  |  733 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   PADnoteParameters.C - Parameters for PADnote (PADsynth)  
  5.   Copyright (C) 2002-2005 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22. #include <math.h>
  23. #include "PADnoteParameters.h"
  24.  
  25. PADnoteParameters::PADnoteParameters(FFTwrapper *fft_,pthread_mutex_t *mutex_):Presets(){
  26.     setpresettype("Ppadsyth");
  27.  
  28.     fft=fft_;
  29.     mutex=mutex_;
  30.     
  31.     resonance=new Resonance();
  32.     oscilgen=new OscilGen(fft_,resonance);
  33.     oscilgen->ADvsPAD=true;
  34.  
  35.     FreqEnvelope=new EnvelopeParams(0,0);
  36.     FreqEnvelope->ASRinit(64,50,64,60);
  37.     FreqLfo=new LFOParams(70,0,64,0,0,0,0,0);
  38.     
  39.     AmpEnvelope=new EnvelopeParams(64,1);
  40.     AmpEnvelope->ADSRinit_dB(0,40,127,25);
  41.     AmpLfo=new LFOParams(80,0,64,0,0,0,0,1);
  42.  
  43.     GlobalFilter=new FilterParams(2,94,40);
  44.     FilterEnvelope=new EnvelopeParams(0,1);
  45.     FilterEnvelope->ADSRinit_filter(64,40,64,70,60,64);
  46.     FilterLfo=new LFOParams(80,0,64,0,0,0,0,2);
  47.     
  48.     for (int i=0;i<PAD_MAX_SAMPLES;i++) sample[i].smp=NULL;
  49.     newsample.smp=NULL;
  50.     
  51.     defaults();
  52. };
  53.  
  54. PADnoteParameters::~PADnoteParameters(){
  55.     deletesamples();
  56.     delete(oscilgen);
  57.     delete(resonance);
  58.  
  59.     delete(FreqEnvelope);
  60.     delete(FreqLfo);
  61.     delete(AmpEnvelope);
  62.     delete(AmpLfo);
  63.     delete(GlobalFilter);
  64.     delete(FilterEnvelope);
  65.     delete(FilterLfo);
  66.     
  67. };
  68.  
  69. void PADnoteParameters::defaults(){
  70.     Pmode=0;
  71.     Php.base.type=0;
  72.     Php.base.par1=80;
  73.     Php.freqmult=0;
  74.     Php.modulator.par1=0;
  75.     Php.modulator.freq=30;
  76.     Php.width=127;
  77.     Php.amp.type=0;
  78.     Php.amp.mode=0;
  79.     Php.amp.par1=80;
  80.     Php.amp.par2=64;
  81.     Php.autoscale=true;
  82.     Php.onehalf=0;
  83.  
  84.     setPbandwidth(500);
  85.     Pbwscale=0;
  86.     
  87.     resonance->defaults();
  88.     oscilgen->defaults();
  89.  
  90.     Phrpos.type=0;
  91.     Phrpos.par1=64;
  92.     Phrpos.par2=64;
  93.     Phrpos.par3=0;
  94.     
  95.     Pquality.samplesize=3;
  96.     Pquality.basenote=4;
  97.     Pquality.oct=3;
  98.     Pquality.smpoct=2;
  99.  
  100.     PStereo=1;//stereo
  101.     /* Frequency Global Parameters */
  102.     Pfixedfreq=0;
  103.     PfixedfreqET=0;
  104.     PDetune=8192;//zero
  105.     PCoarseDetune=0;
  106.     PDetuneType=1;
  107.     FreqEnvelope->defaults();
  108.     FreqLfo->defaults();
  109.     
  110.     /* Amplitude Global Parameters */
  111.     PVolume=90;
  112.     PPanning=64;//center
  113.     PAmpVelocityScaleFunction=64;
  114.     AmpEnvelope->defaults();
  115.     AmpLfo->defaults();
  116.     PPunchStrength=0;
  117.     PPunchTime=60;
  118.     PPunchStretch=64;
  119.     PPunchVelocitySensing=72;
  120.     
  121.     /* Filter Global Parameters*/
  122.     PFilterVelocityScale=64;
  123.     PFilterVelocityScaleFunction=64;
  124.     GlobalFilter->defaults();
  125.     FilterEnvelope->defaults();
  126.     FilterLfo->defaults();
  127.  
  128.     deletesamples();
  129. };
  130.  
  131. void PADnoteParameters::deletesample(int n){
  132.     if ((n<0)||(n>=PAD_MAX_SAMPLES)) return;
  133.     if (sample[n].smp!=NULL){
  134.     delete(sample[n].smp);
  135.     sample[n].smp=NULL;
  136.     };
  137.     sample[n].size=0;
  138.     sample[n].basefreq=440.0;
  139. };
  140.  
  141. void PADnoteParameters::deletesamples(){
  142.     for (int i=0;i<PAD_MAX_SAMPLES;i++) deletesample(i);
  143. };
  144.  
  145. /*
  146.  * Get the harmonic profile (i.e. the frequency distributio of a single harmonic)
  147.  */
  148. REALTYPE PADnoteParameters::getprofile(REALTYPE *smp,int size){
  149.     for (int i=0;i<size;i++) smp[i]=0.0;
  150.     const int supersample=16;
  151.     REALTYPE basepar=pow(2.0,(1.0-Php.base.par1/127.0)*12.0);
  152.     REALTYPE freqmult=floor(pow(2.0,Php.freqmult/127.0*5.0)+0.000001);
  153.  
  154.     REALTYPE modfreq=floor(pow(2.0,Php.modulator.freq/127.0*5.0)+0.000001);
  155.     REALTYPE modpar1=pow(Php.modulator.par1/127.0,4.0)*5.0/sqrt(modfreq);
  156.     REALTYPE amppar1=pow(2.0,pow(Php.amp.par1/127.0,2.0)*10.0)-0.999;
  157.     REALTYPE amppar2=(1.0-Php.amp.par2/127.0)*0.998+0.001;
  158.     REALTYPE width=pow(150.0/(Php.width+22.0),2.0);
  159.  
  160.     for (int i=0;i<size*supersample;i++){
  161.     bool makezero=false;    
  162.     REALTYPE x=i*1.0/(size*(REALTYPE) supersample);
  163.  
  164.     REALTYPE origx=x;
  165.     
  166.     //do the sizing (width)
  167.     x=(x-0.5)*width+0.5;
  168.     if (x<0.0) {
  169.         x=0.0; 
  170.         makezero=true;
  171.     } else {
  172.         if (x>1.0) {
  173.         x=1.0;
  174.         makezero=true;
  175.         };
  176.     };
  177.  
  178.     //compute the full profile or one half
  179.     switch(Php.onehalf){
  180.         case 1:x=x*0.5+0.5;
  181.         break;
  182.         case 2:x=x*0.5;
  183.         break;
  184.     };    
  185.  
  186.     REALTYPE x_before_freq_mult=x;
  187.  
  188.     //do the frequency multiplier
  189.     x*=freqmult;
  190.  
  191.     //do the modulation of the profile 
  192.     x+=sin(x_before_freq_mult*3.1415926*modfreq)*modpar1;
  193.     x=fmod(x+1000.0,1.0)*2.0-1.0;
  194.  
  195.  
  196.     //this is the base function of the profile
  197.     REALTYPE f;
  198.     switch (Php.base.type){
  199.         case 1:f=exp(-(x*x)*basepar);if (f<0.4) f=0.0; else f=1.0;
  200.         break;
  201.         case 2:f=exp(-(fabs(x))*sqrt(basepar));
  202.         break;
  203.         default:f=exp(-(x*x)*basepar);
  204.         break;
  205.     };
  206.     if (makezero) f=0.0;
  207.     
  208.     REALTYPE amp=1.0;
  209.     origx=origx*2.0-1.0;
  210.  
  211.     //compute the amplitude multiplier
  212.     switch(Php.amp.type){
  213.         case 1:amp=exp(-(origx*origx)*10.0*amppar1);
  214.         break;
  215.         case 2:amp=0.5*(1.0+cos(3.1415926*origx*sqrt(amppar1*4.0+1.0)));
  216.         break;
  217.         case 3:amp=1.0/(pow(origx*(amppar1*2.0+0.8),14.0)+1.0);
  218.         break;
  219.     };
  220.  
  221.     //apply the amplitude multiplier    
  222.     REALTYPE finalsmp=f;
  223.     if (Php.amp.type!=0){
  224.         switch(Php.amp.mode){
  225.         case 0:finalsmp=amp*(1.0-amppar2)+finalsmp*amppar2;
  226.             break;
  227.         case 1:finalsmp*=amp*(1.0-amppar2)+amppar2;
  228.             break;
  229.         case 2:finalsmp=finalsmp/(amp+pow(amppar2,4.0)*20.0+0.0001);
  230.             break;
  231.         case 3:finalsmp=amp/(finalsmp+pow(amppar2,4.0)*20.0+0.0001);
  232.             break;
  233.         };
  234.     };
  235.  
  236.     smp[i/supersample]+=finalsmp/supersample;
  237.     };    
  238.  
  239.     //normalize the profile (make the max. to be equal to 1.0)
  240.     REALTYPE max=0.0;
  241.     for (int i=0;i<size;i++) {
  242.     if (smp[i]<0.0) smp[i]=0.0;
  243.     if (smp[i]>max) max=smp[i];
  244.     };
  245.     if (max<0.00001) max=1.0;
  246.     for (int i=0;i<size;i++) smp[i]/=max;
  247.     
  248.     if (!Php.autoscale) return(0.5);
  249.  
  250.     //compute the estimated perceived bandwidth
  251.     REALTYPE sum=0.0;
  252.     int i;
  253.     for (i=0;i<size/2-2;i++) {
  254.     sum+=smp[i]*smp[i]+smp[size-i-1]*smp[size-i-1];
  255.     if (sum>=4.0) break;
  256.     };
  257.     
  258.     REALTYPE result=1.0-2.0*i/(REALTYPE) size;
  259.     return(result);
  260. };
  261.  
  262. /*
  263.  * Compute the real bandwidth in cents and returns it
  264.  * Also, sets the bandwidth parameter
  265.  */
  266. REALTYPE PADnoteParameters::setPbandwidth(int Pbandwidth){
  267.     this->Pbandwidth=Pbandwidth;
  268.     REALTYPE result=pow(Pbandwidth/1000.0,1.1);
  269.     result=pow(10.0,result*4.0)*0.25;
  270.     return(result);
  271. };
  272.  
  273. /*
  274.  * Get the harmonic(overtone) position
  275.  */
  276. REALTYPE PADnoteParameters::getNhr(int n){
  277.     REALTYPE result=1.0;
  278.     REALTYPE par1=pow(10.0,-(1.0-Phrpos.par1/255.0)*3.0);
  279.     REALTYPE par2=Phrpos.par2/255.0;
  280.     
  281.     REALTYPE n0=n-1.0;
  282.     REALTYPE tmp=0.0;
  283.     int thresh=0;
  284.     switch(Phrpos.type){
  285.     case 1:
  286.         thresh=(int)(par2*par2*100.0)+1;
  287.         if (n<thresh) result=n;
  288.         else result=1.0+n0+(n0-thresh+1.0)*par1*8.0;
  289.         break;
  290.     case 2:        
  291.         thresh=(int)(par2*par2*100.0)+1;
  292.         if (n<thresh) result=n;
  293.         else result=1.0+n0-(n0-thresh+1.0)*par1*0.90;
  294.         break;
  295.     case 3:
  296.         tmp=par1*100.0+1.0;
  297.         result=pow(n0/tmp,1.0-par2*0.8)*tmp+1.0;
  298.         break;
  299.     case 4:
  300.         result=n0*(1.0-par1)+pow(n0*0.1,par2*3.0+1.0)*par1*10.0+1.0;
  301.         break;
  302.     case 5:
  303.         result=n0+sin(n0*par2*par2*PI*0.999)*sqrt(par1)*2.0+1.0;
  304.         break;
  305.     case 6:
  306.         tmp=pow(par2*2.0,2.0)+0.1;
  307.         result=n0*pow(1.0+par1*pow(n0*0.8,tmp),tmp)+1.0;
  308.         break;
  309.     default:
  310.         result=n;
  311.         break;
  312.     };
  313.  
  314.     REALTYPE par3=Phrpos.par3/255.0;
  315.     
  316.     REALTYPE iresult=floor(result+0.5);
  317.     REALTYPE dresult=result-iresult;
  318.  
  319.     result=iresult+(1.0-par3)*dresult;
  320.  
  321.     return(result);
  322. };
  323.  
  324. /*
  325.  * Generates the long spectrum for Bandwidth mode (only amplitudes are generated; phases will be random)
  326.  */
  327. void PADnoteParameters::generatespectrum_bandwidthMode(REALTYPE *spectrum, int size,REALTYPE basefreq,REALTYPE *profile,int profilesize,REALTYPE bwadjust){
  328.     for (int i=0;i<size;i++) spectrum[i]=0.0;
  329.     
  330.     REALTYPE harmonics[OSCIL_SIZE/2];
  331.     for (int i=0;i<OSCIL_SIZE/2;i++) harmonics[i]=0.0;
  332.     //get the harmonic structure from the oscillator (I am using the frequency amplitudes, only)
  333.     oscilgen->get(harmonics,basefreq,false);
  334.  
  335.     //normalize
  336.     REALTYPE max=0.0;
  337.     for (int i=0;i<OSCIL_SIZE/2;i++) if (harmonics[i]>max) max=harmonics[i];
  338.     if (max<0.000001) max=1;
  339.     for (int i=0;i<OSCIL_SIZE/2;i++) harmonics[i]/=max;
  340.     
  341.     for (int nh=1;nh<OSCIL_SIZE/2;nh++){//for each harmonic
  342.     REALTYPE realfreq=getNhr(nh)*basefreq;
  343.     if (realfreq>SAMPLE_RATE*0.49999) break;
  344.     if (realfreq<20.0) break;
  345.     if (harmonics[nh-1]<1e-4) continue;
  346.  
  347.     //compute the bandwidth of each harmonic
  348.     REALTYPE bandwidthcents=setPbandwidth(Pbandwidth);
  349.     REALTYPE bw=(pow(2.0,bandwidthcents/1200.0)-1.0)*basefreq/bwadjust;
  350.     REALTYPE power=1.0;
  351.     switch (Pbwscale){
  352.         case 0: power=1.0;break;
  353.         case 1: power=0.0;break;
  354.         case 2: power=0.25;break;
  355.         case 3: power=0.5;break;
  356.         case 4: power=0.75;break;
  357.         case 5: power=1.5;break;
  358.         case 6: power=2.0;break;
  359.         case 7: power=-0.5;break;
  360.     };
  361.     bw=bw*pow(realfreq/basefreq,power);
  362.         int ibw=(int)((bw/(SAMPLE_RATE*0.5)*size))+1;
  363.  
  364.     REALTYPE amp=harmonics[nh-1];
  365.     if (resonance->Penabled) amp*=resonance->getfreqresponse(realfreq);
  366.     
  367.     if (ibw>profilesize){//if the bandwidth is larger than the profilesize
  368.         REALTYPE rap=sqrt((REALTYPE)profilesize/(REALTYPE)ibw);
  369.         int cfreq=(int) (realfreq/(SAMPLE_RATE*0.5)*size)-ibw/2;
  370.         for (int i=0;i<ibw;i++){
  371.         int src=(int)(i*rap*rap);
  372.         int spfreq=i+cfreq;
  373.         if (spfreq<0) continue;
  374.         if (spfreq>=size) break;
  375.         spectrum[spfreq]+=amp*profile[src]*rap;
  376.         };
  377.     }else{//if the bandwidth is smaller than the profilesize
  378.         REALTYPE rap=sqrt((REALTYPE)ibw/(REALTYPE)profilesize);
  379.         REALTYPE ibasefreq=realfreq/(SAMPLE_RATE*0.5)*size;
  380.         for (int i=0;i<profilesize;i++){
  381.         REALTYPE idfreq=i/(REALTYPE)profilesize-0.5;
  382.         idfreq*=ibw;
  383.         int spfreq=(int) (idfreq+ibasefreq);
  384.         if (spfreq<=0) continue;
  385.         if (spfreq>=size) break;
  386.         spectrum[spfreq]+=amp*profile[i]*rap;
  387.         };
  388.     };
  389.     };
  390. };
  391.  
  392. /*
  393.  * Generates the long spectrum for non-Bandwidth modes (only amplitudes are generated; phases will be random)
  394.  */
  395. void PADnoteParameters::generatespectrum_otherModes(REALTYPE *spectrum, int size,REALTYPE basefreq,REALTYPE *profile,int profilesize,REALTYPE bwadjust){
  396.     for (int i=0;i<size;i++) spectrum[i]=0.0;
  397.     
  398.     REALTYPE harmonics[OSCIL_SIZE/2];
  399.     for (int i=0;i<OSCIL_SIZE/2;i++) harmonics[i]=0.0;
  400.     //get the harmonic structure from the oscillator (I am using the frequency amplitudes, only)
  401.     oscilgen->get(harmonics,basefreq,false);
  402.  
  403.     //normalize
  404.     REALTYPE max=0.0;
  405.     for (int i=0;i<OSCIL_SIZE/2;i++) if (harmonics[i]>max) max=harmonics[i];
  406.     if (max<0.000001) max=1;
  407.     for (int i=0;i<OSCIL_SIZE/2;i++) harmonics[i]/=max;
  408.  
  409.     for (int nh=1;nh<OSCIL_SIZE/2;nh++){//for each harmonic
  410.     REALTYPE realfreq=getNhr(nh)*basefreq;
  411.     
  412.     ///sa fac aici interpolarea si sa am grija daca frecv descresc
  413.     
  414.     if (realfreq>SAMPLE_RATE*0.49999) break;
  415.     if (realfreq<20.0) break;
  416. //    if (harmonics[nh-1]<1e-4) continue;
  417.  
  418.  
  419.     REALTYPE amp=harmonics[nh-1];
  420.     if (resonance->Penabled) amp*=resonance->getfreqresponse(realfreq);
  421.     int cfreq=(int) (realfreq/(SAMPLE_RATE*0.5)*size);
  422.  
  423.     spectrum[cfreq]=amp+1e-9;
  424.     };
  425.     
  426.     if (Pmode!=1){    
  427.         int old=0;
  428.     for (int k=1;k<size;k++){
  429.         if ( (spectrum[k]>1e-10) || (k==(size-1)) ){
  430.         int delta=k-old;
  431.         REALTYPE val1=spectrum[old];
  432.         REALTYPE val2=spectrum[k];
  433.         REALTYPE idelta=1.0/delta;
  434.         for (int i=0;i<delta;i++){
  435.             REALTYPE x=idelta*i;
  436.             spectrum[old+i]=val1*(1.0-x)+val2*x;
  437.         };
  438.         old=k;
  439.         };
  440.     };    
  441.     };
  442.     
  443. };
  444.  
  445. /*
  446.  * Applies the parameters (i.e. computes all the samples, based on parameters);
  447.  */
  448. void PADnoteParameters::applyparameters(bool lockmutex){
  449.     const int samplesize=(((int) 1)<<(Pquality.samplesize+14));
  450.     int spectrumsize=samplesize/2;
  451.     REALTYPE spectrum[spectrumsize];
  452.     int profilesize=512;
  453.     REALTYPE profile[profilesize];
  454.  
  455.  
  456.     REALTYPE bwadjust=getprofile(profile,profilesize);
  457. //    for (int i=0;i<profilesize;i++) profile[i]*=profile[i];
  458.     REALTYPE basefreq=65.406*pow(2.0,Pquality.basenote/2);
  459.     if (Pquality.basenote%2==1) basefreq*=1.5;
  460.  
  461.     int samplemax=Pquality.oct+1;
  462.     int smpoct=Pquality.smpoct;
  463.     if (Pquality.smpoct==5) smpoct=6;
  464.     if (Pquality.smpoct==6) smpoct=12;
  465.     if (smpoct!=0) samplemax*=smpoct;
  466.     else samplemax=samplemax/2+1;
  467.     if (samplemax==0) samplemax=1;
  468.     
  469.     //prepare a BIG FFT stuff
  470.     FFTwrapper *fft=new FFTwrapper(samplesize);
  471.     FFTFREQS fftfreqs;
  472.     newFFTFREQS(&fftfreqs,samplesize/2);
  473.     
  474.     REALTYPE adj[samplemax];//this is used to compute frequency relation to the base frequency
  475.     for (int nsample=0;nsample<samplemax;nsample++) adj[nsample]=(Pquality.oct+1.0)*(REALTYPE)nsample/samplemax;
  476.     for (int nsample=0;nsample<samplemax;nsample++){
  477.     REALTYPE tmp=adj[nsample]-adj[samplemax-1]*0.5;
  478.     REALTYPE basefreqadjust=pow(2.0,tmp);
  479.  
  480.         if (Pmode==0) generatespectrum_bandwidthMode(spectrum,spectrumsize,basefreq*basefreqadjust,profile,profilesize,bwadjust);
  481.         else generatespectrum_otherModes(spectrum,spectrumsize,basefreq*basefreqadjust,profile,profilesize,bwadjust);
  482.  
  483.     const int extra_samples=5;//the last samples contains the first samples (used for linear/cubic interpolation)
  484.         newsample.smp=new REALTYPE[samplesize+extra_samples];
  485.     
  486.     newsample.smp[0]=0.0;
  487.     for (int i=1;i<spectrumsize;i++){//makes the phases as random
  488.         REALTYPE phase=RND*6.29;
  489.         fftfreqs.c[i]=spectrum[i]*cos(phase);
  490.         fftfreqs.s[i]=spectrum[i]*sin(phase);
  491.     };
  492.     fft->freqs2smps(fftfreqs,newsample.smp);//that's all; here is the only ifft for the whole sample; no windows are used ;-)
  493.     
  494.  
  495.         //normalize(rms)
  496.     REALTYPE rms=0.0;
  497.         for (int i=0;i<samplesize;i++) rms+=newsample.smp[i]*newsample.smp[i];
  498.     rms=sqrt(rms);
  499.         if (rms<0.000001) rms=1.0;
  500.     rms*=sqrt(262144.0/samplesize);
  501.         for (int i=0;i<samplesize;i++) newsample.smp[i]*=1.0/rms*50.0;
  502.     
  503.     //prepare extra samples used by the linear or cubic interpolation
  504.         for (int i=0;i<extra_samples;i++) newsample.smp[i+samplesize]=newsample.smp[i];
  505.  
  506.     //replace the current sample with the new computed sample
  507.     if (lockmutex){
  508.         pthread_mutex_lock(mutex);
  509.          deletesample(nsample);
  510.          sample[nsample].smp=newsample.smp;
  511.              sample[nsample].size=samplesize;
  512.          sample[nsample].basefreq=basefreq*basefreqadjust;
  513.         pthread_mutex_unlock(mutex);
  514.     } else {
  515.         deletesample(nsample);
  516.         sample[nsample].smp=newsample.smp;
  517.         sample[nsample].size=samplesize;
  518.         sample[nsample].basefreq=basefreq*basefreqadjust;
  519.     };
  520.     newsample.smp=NULL;
  521.     };
  522.     delete(fft);
  523.     deleteFFTFREQS(&fftfreqs);
  524.     
  525.     //delete the additional samples that might exists and are not useful
  526.     for (int i=samplemax;i<PAD_MAX_SAMPLES;i++) deletesample(i);
  527. };
  528.  
  529.  
  530. void PADnoteParameters::add2XML(XMLwrapper *xml){
  531.     xml->information.PADsynth_used=true;
  532.  
  533.     xml->addparbool("stereo",PStereo);
  534.     xml->addpar("mode",Pmode);
  535.     xml->addpar("bandwidth",Pbandwidth);
  536.     xml->addpar("bandwidth_scale",Pbwscale);
  537.  
  538.     xml->beginbranch("HARMONIC_PROFILE");
  539.     xml->addpar("base_type",Php.base.type);
  540.     xml->addpar("base_par1",Php.base.par1);
  541.     xml->addpar("frequency_multiplier",Php.freqmult);
  542.     xml->addpar("modulator_par1",Php.modulator.par1);
  543.     xml->addpar("modulator_frequency",Php.modulator.freq);
  544.     xml->addpar("width",Php.width);
  545.     xml->addpar("amplitude_multiplier_type",Php.amp.type);
  546.     xml->addpar("amplitude_multiplier_mode",Php.amp.mode);
  547.     xml->addpar("amplitude_multiplier_par1",Php.amp.par1);
  548.     xml->addpar("amplitude_multiplier_par2",Php.amp.par2);
  549.     xml->addparbool("autoscale",Php.autoscale);
  550.     xml->addpar("one_half",Php.onehalf);
  551.     xml->endbranch();
  552.  
  553.     xml->beginbranch("OSCIL");
  554.         oscilgen->add2XML(xml);
  555.     xml->endbranch();
  556.  
  557.     xml->beginbranch("RESONANCE");
  558.         resonance->add2XML(xml);
  559.     xml->endbranch();
  560.  
  561.     xml->beginbranch("HARMONIC_POSITION");
  562.     xml->addpar("type",Phrpos.type);
  563.     xml->addpar("parameter1",Phrpos.par1);
  564.     xml->addpar("parameter2",Phrpos.par2);
  565.     xml->addpar("parameter3",Phrpos.par3);
  566.     xml->endbranch();
  567.  
  568.     xml->beginbranch("SAMPLE_QUALITY");
  569.     xml->addpar("samplesize",Pquality.samplesize);
  570.     xml->addpar("basenote",Pquality.basenote);
  571.     xml->addpar("octaves",Pquality.oct);
  572.     xml->addpar("samples_per_octave",Pquality.smpoct);
  573.     xml->endbranch();
  574.  
  575.     xml->beginbranch("AMPLITUDE_PARAMETERS");
  576.     xml->addpar("volume",PVolume);
  577.     xml->addpar("panning",PPanning);
  578.     xml->addpar("velocity_sensing",PAmpVelocityScaleFunction);
  579.     xml->addpar("punch_strength",PPunchStrength);
  580.     xml->addpar("punch_time",PPunchTime);
  581.     xml->addpar("punch_stretch",PPunchStretch);
  582.     xml->addpar("punch_velocity_sensing",PPunchVelocitySensing);
  583.     
  584.     xml->beginbranch("AMPLITUDE_ENVELOPE");
  585.         AmpEnvelope->add2XML(xml);
  586.     xml->endbranch();
  587.     
  588.     xml->beginbranch("AMPLITUDE_LFO");
  589.         AmpLfo->add2XML(xml);
  590.     xml->endbranch();
  591.  
  592.     xml->endbranch();
  593.     
  594.     xml->beginbranch("FREQUENCY_PARAMETERS");
  595.         xml->addpar("fixed_freq",Pfixedfreq);
  596.         xml->addpar("fixed_freq_et",PfixedfreqET);
  597.         xml->addpar("detune",PDetune);
  598.         xml->addpar("coarse_detune",PCoarseDetune);
  599.         xml->addpar("detune_type",PDetuneType);
  600.     
  601.     xml->beginbranch("FREQUENCY_ENVELOPE");
  602.         FreqEnvelope->add2XML(xml);
  603.     xml->endbranch();
  604.  
  605.     xml->beginbranch("FREQUENCY_LFO");
  606.         FreqLfo->add2XML(xml);
  607.     xml->endbranch();
  608.     xml->endbranch();
  609.     
  610.     xml->beginbranch("FILTER_PARAMETERS");
  611.     xml->addpar("velocity_sensing_amplitude",PFilterVelocityScale);
  612.     xml->addpar("velocity_sensing",PFilterVelocityScaleFunction);
  613.     
  614.     xml->beginbranch("FILTER");
  615.         GlobalFilter->add2XML(xml);
  616.     xml->endbranch();
  617.     
  618.     xml->beginbranch("FILTER_ENVELOPE");
  619.         FilterEnvelope->add2XML(xml);
  620.     xml->endbranch();
  621.     
  622.     xml->beginbranch("FILTER_LFO");
  623.         FilterLfo->add2XML(xml);
  624.     xml->endbranch();
  625.     xml->endbranch();    
  626. };
  627.  
  628. void PADnoteParameters::getfromXML(XMLwrapper *xml){
  629.     PStereo=xml->getparbool("stereo",PStereo);
  630.     Pmode=xml->getpar127("mode",0);
  631.     Pbandwidth=xml->getpar("bandwidth",Pbandwidth,0,1000);
  632.     Pbwscale=xml->getpar127("bandwidth_scale",Pbwscale);
  633.  
  634.     if (xml->enterbranch("HARMONIC_PROFILE")){
  635.     Php.base.type=xml->getpar127("base_type",Php.base.type);
  636.     Php.base.par1=xml->getpar127("base_par1",Php.base.par1);
  637.     Php.freqmult=xml->getpar127("frequency_multiplier",Php.freqmult);
  638.     Php.modulator.par1=xml->getpar127("modulator_par1",Php.modulator.par1);
  639.     Php.modulator.freq=xml->getpar127("modulator_frequency",Php.modulator.freq);
  640.     Php.width=xml->getpar127("width",Php.width);
  641.     Php.amp.type=xml->getpar127("amplitude_multiplier_type",Php.amp.type);
  642.     Php.amp.mode=xml->getpar127("amplitude_multiplier_mode",Php.amp.mode);
  643.     Php.amp.par1=xml->getpar127("amplitude_multiplier_par1",Php.amp.par1);
  644.     Php.amp.par2=xml->getpar127("amplitude_multiplier_par2",Php.amp.par2);
  645.     Php.autoscale=xml->getparbool("autoscale",Php.autoscale);
  646.     Php.onehalf=xml->getpar127("one_half",Php.onehalf);
  647.      xml->exitbranch();
  648.     };
  649.  
  650.     if (xml->enterbranch("OSCIL")){
  651.         oscilgen->getfromXML(xml);
  652.      xml->exitbranch();
  653.     };
  654.  
  655.     if (xml->enterbranch("RESONANCE")){
  656.         resonance->getfromXML(xml);
  657.      xml->exitbranch();
  658.     };
  659.  
  660.     if (xml->enterbranch("HARMONIC_POSITION")){
  661.     Phrpos.type=xml->getpar127("type",Phrpos.type);
  662.     Phrpos.par1=xml->getpar("parameter1",Phrpos.par1,0,255);
  663.     Phrpos.par2=xml->getpar("parameter2",Phrpos.par2,0,255);
  664.     Phrpos.par3=xml->getpar("parameter3",Phrpos.par3,0,255);
  665.      xml->exitbranch();
  666.     };
  667.  
  668.     if (xml->enterbranch("SAMPLE_QUALITY")){
  669.     Pquality.samplesize=xml->getpar127("samplesize",Pquality.samplesize);
  670.     Pquality.basenote=xml->getpar127("basenote",Pquality.basenote);
  671.     Pquality.oct=xml->getpar127("octaves",Pquality.oct);
  672.     Pquality.smpoct=xml->getpar127("samples_per_octave",Pquality.smpoct);
  673.      xml->exitbranch();
  674.     };
  675.  
  676.     if (xml->enterbranch("AMPLITUDE_PARAMETERS")){
  677.     PVolume=xml->getpar127("volume",PVolume);
  678.     PPanning=xml->getpar127("panning",PPanning);
  679.     PAmpVelocityScaleFunction=xml->getpar127("velocity_sensing",PAmpVelocityScaleFunction);
  680.     PPunchStrength=xml->getpar127("punch_strength",PPunchStrength);
  681.     PPunchTime=xml->getpar127("punch_time",PPunchTime);
  682.     PPunchStretch=xml->getpar127("punch_stretch",PPunchStretch);
  683.     PPunchVelocitySensing=xml->getpar127("punch_velocity_sensing",PPunchVelocitySensing);
  684.     
  685.     xml->enterbranch("AMPLITUDE_ENVELOPE");
  686.         AmpEnvelope->getfromXML(xml);
  687.     xml->exitbranch();
  688.     
  689.     xml->enterbranch("AMPLITUDE_LFO");
  690.         AmpLfo->getfromXML(xml);
  691.     xml->exitbranch();
  692.  
  693.      xml->exitbranch();
  694.     };
  695.     
  696.     if (xml->enterbranch("FREQUENCY_PARAMETERS")){
  697.     Pfixedfreq=xml->getpar127("fixed_freq",Pfixedfreq);
  698.         PfixedfreqET=xml->getpar127("fixed_freq_et",PfixedfreqET);
  699.         PDetune=xml->getpar("detune",PDetune,0,16383);
  700.         PCoarseDetune=xml->getpar("coarse_detune",PCoarseDetune,0,16383);
  701.         PDetuneType=xml->getpar127("detune_type",PDetuneType);
  702.     
  703.     xml->enterbranch("FREQUENCY_ENVELOPE");
  704.         FreqEnvelope->getfromXML(xml);
  705.     xml->exitbranch();
  706.  
  707.     xml->enterbranch("FREQUENCY_LFO");
  708.         FreqLfo->getfromXML(xml);
  709.     xml->exitbranch();
  710.      xml->exitbranch();
  711.     };
  712.     
  713.     if (xml->enterbranch("FILTER_PARAMETERS")){
  714.     PFilterVelocityScale=xml->getpar127("velocity_sensing_amplitude",PFilterVelocityScale);
  715.     PFilterVelocityScaleFunction=xml->getpar127("velocity_sensing",PFilterVelocityScaleFunction);
  716.     
  717.     xml->enterbranch("FILTER");
  718.         GlobalFilter->getfromXML(xml);
  719.     xml->exitbranch();
  720.     
  721.     xml->enterbranch("FILTER_ENVELOPE");
  722.         FilterEnvelope->getfromXML(xml);
  723.     xml->exitbranch();
  724.     
  725.     xml->enterbranch("FILTER_LFO");
  726.         FilterLfo->getfromXML(xml);
  727.     xml->exitbranch();
  728.      xml->exitbranch();    
  729.     };
  730. };
  731.  
  732.  
  733.